#load relevant libraries
library(dplyr)
library(ggplot2)
#Import data into a new data frame
MasterData<-read.csv("~/downloads/Data Summary_CLEAN.csv")
#eliminating redundant columns
MasterData<-MasterData[,1:12]
#Changing column names
names(MasterData) <- c("ID","Sex","Language","Final_grade","IU","Per_correct","Per_aware","Time_hw","Time_pron","Time_LS","Per_correct_hw","Per_complete_LS")
#Examine scatter plots for different variable combination pairs
#Creating scatter plots for all pairs
pairs(MasterData)

#Time spent on Connect homework, Percentage of correct homework responses
ggplot(MasterData, aes(Time_hw,Per_correct_hw))+ geom_point() + stat_sum(aes(group = 1))

#Time spent on Connect homework, Time spent on LearnSmart adaptive activities
ggplot(MasterData, aes(Time_hw,Time_LS))+ geom_point() + stat_sum(aes(group = 1))

#Percentage of correct homework responses, Final course grade
ggplot(MasterData, aes(Per_correct_hw,Final_grade))+ geom_point() + stat_sum(aes(group = 1))

#Percentage of correct LearnSmart responses, Percentage of awareness of correct/incorrect responses
ggplot(MasterData, aes(Per_correct,Per_aware))+ geom_point() + stat_sum(aes(group = 1))

#Percentage of completion of assigned LearnSmart activities, Final course grade
ggplot(MasterData, aes(Per_complete_LS,Final_grade))+ geom_point() + stat_sum(aes(group = 1))

#Percentage of completion of assigned LearnSmart activities, Percentage of incorrect and unaware LearnSmart responses
ggplot(MasterData, aes(Per_complete_LS,IU))+ geom_point() + stat_sum(aes(group = 1))

#Time spent on LearnSmart adaptive activities, Final course grade
ggplot(MasterData, aes(Time_LS,Final_grade))+ geom_point() + stat_sum(aes(group = 1))

#Percentage of incorrect and unaware LearnSmart responses, Final course grade
ggplot(MasterData, aes(IU,Final_grade))+ geom_point() + stat_sum(aes(group = 1))

#Percentage of incorrect and unaware LearnSmart responses, Time spent on LearnSmart adaptive activities
ggplot(MasterData, aes(IU,Time_LS))+ geom_point() + stat_sum(aes(group = 1))

#Percentage of incorrect and unaware LearnSmart responses, Time spent on Connect homework
ggplot(MasterData, aes(IU,Time_hw))+ geom_point() + stat_sum(aes(group = 1))

#Create new data frame for scaled data, removing non-clustering variables
ScaledData<-as.data.frame(cbind(MasterData[,1:3],scale(select(MasterData, Final_grade:Per_complete_LS))))
#Calculate Mean and Standard Deviation for scaled data
sapply(ScaledData[,4:12], mean)
Final_grade IU Per_correct Per_aware Time_hw Time_pron Time_LS
5.843135e-17 -1.133857e-16 9.600179e-17 -4.490148e-16 -3.776554e-17 5.052708e-17 8.279565e-17
Per_correct_hw Per_complete_LS
2.015534e-16 4.870925e-18
sapply(ScaledData[,4:12], sd)
Final_grade IU Per_correct Per_aware Time_hw Time_pron Time_LS
1 1 1 1 1 1 1
Per_correct_hw Per_complete_LS
1 1
#Creating the Within Group Sum of Squares function
wssplot <- function(data, nc=15, seed=1234){
wss <- (nrow(data)-1)*sum(apply(data,2,var))
for (i in 2:nc){
set.seed(seed)
wss[i] <- sum(kmeans(data, centers=i)$withinss)}
plot(1:nc, wss, type="b", xlab="Number of Clusters",
ylab="Within groups sum of squares")}
#Create the WSS Graph
wssplot(ScaledData[,4:12],nc=15,seed=1234)

#Create and examine several different possible cluster solutions
threeclusterkmeans<-kmeans(ScaledData[,4:12], 3, nstart=10)
threeclusterkmeans
fourclusterkmeans<-kmeans(ScaledData[,4:12], 4, nstart=10)
fourclusterkmeans
#Assign the clusters for each observation for k=3,4,5 to a new dataframe
Clusters<-data.frame(MasterData, threeclusterkmeans$cluster, fourclusterkmeans$cluster, fiveclusterkmeans$cluster)
Error in data.frame(MasterData, threeclusterkmeans$cluster, fourclusterkmeans$cluster, :
object 'fiveclusterkmeans' not found
#Graph the different solutions - Three Clusters.
#Shapes indicate Language Background. To change which variable is marked by shape, change the name of the variable in "shape=Language"
ggplot(Clusters, aes(Time_hw,Per_correct_hw, group = factor(threeclusterkmeans.cluster))) + geom_point((aes(shape=Language, color = factor(threeclusterkmeans.cluster))))

ggplot(Clusters, aes(Time_hw,Time_LS, group = factor(threeclusterkmeans.cluster))) + geom_point((aes(shape=Language, color = factor(threeclusterkmeans.cluster))))

ggplot(Clusters, aes(Per_correct_hw,Final_grade, group = factor(threeclusterkmeans.cluster))) + geom_point((aes(shape=Language, color = factor(threeclusterkmeans.cluster))))

ggplot(Clusters, aes(Per_correct,Per_aware, group = factor(threeclusterkmeans.cluster))) + geom_point((aes(shape=Language, color = factor(threeclusterkmeans.cluster))))

ggplot(Clusters, aes(Per_complete_LS,Final_grade, group = factor(threeclusterkmeans.cluster))) + geom_point((aes(shape=Language, color = factor(threeclusterkmeans.cluster))))

ggplot(Clusters, aes(Per_complete_LS,IU, group = factor(threeclusterkmeans.cluster))) + geom_point((aes(shape=Language, color = factor(threeclusterkmeans.cluster))))

ggplot(Clusters, aes(Time_LS,Final_grade, group = factor(threeclusterkmeans.cluster))) + geom_point((aes(shape=Language, color = factor(threeclusterkmeans.cluster))))

ggplot(Clusters, aes(IU,Final_grade, group = factor(threeclusterkmeans.cluster))) + geom_point((aes(shape=Language, color = factor(threeclusterkmeans.cluster))))

ggplot(Clusters, aes(IU,Time_LS, group = factor(threeclusterkmeans.cluster))) + geom_point((aes(shape=Language, color = factor(threeclusterkmeans.cluster))))

ggplot(Clusters, aes(IU,Time_hw, group = factor(threeclusterkmeans.cluster))) + geom_point((aes(shape=Language, color = factor(threeclusterkmeans.cluster))))

#Graph the different solutions - Four Clusters.
#Shapes indicate Language Background. To change which variable is marked by shape, change the name of the variable in "shape=Language
ggplot(Clusters, aes(Time_hw,Per_correct_hw, group = factor(fourclusterkmeans.cluster))) + geom_point((aes(size=2,shape=Sex, color = factor(fourclusterkmeans.cluster))))

ggplot(Clusters, aes(Time_hw,Time_LS, group = factor(fourclusterkmeans.cluster))) + geom_point((aes(size=2,shape=Sex, color = factor(fourclusterkmeans.cluster))))

ggplot(Clusters, aes(Per_correct_hw,Final_grade, group = factor(fourclusterkmeans.cluster))) + geom_point((aes(size=2,shape=Sex, color = factor(fourclusterkmeans.cluster))))

ggplot(Clusters, aes(Per_correct,Per_aware, group = factor(fourclusterkmeans.cluster))) + geom_point((aes(size=2,shape=Sex, color = factor(fourclusterkmeans.cluster))))

ggplot(Clusters, aes(Per_complete_LS,Final_grade, group = factor(fourclusterkmeans.cluster))) + geom_point((aes(size=2,shape=Sex, color = factor(fourclusterkmeans.cluster))))

ggplot(Clusters, aes(Per_complete_LS,IU, group = factor(fourclusterkmeans.cluster))) + geom_point((aes(size=2,shape=Sex, color = factor(fourclusterkmeans.cluster))))

ggplot(Clusters, aes(Time_LS,Final_grade, group = factor(fourclusterkmeans.cluster))) + geom_point((aes(size=2,shape=Sex, color = factor(fourclusterkmeans.cluster))))

ggplot(Clusters, aes(IU,Final_grade, group = factor(fourclusterkmeans.cluster))) + geom_point((aes(size=2,shape=Sex, color = factor(fourclusterkmeans.cluster))))

ggplot(Clusters, aes(IU,Time_LS, group = factor(fourclusterkmeans.cluster))) + geom_point((aes(size=2,shape=Sex, color = factor(fourclusterkmeans.cluster))))

ggplot(Clusters, aes(IU,Time_hw, group = factor(fourclusterkmeans.cluster))) + geom_point((aes(size=2,shape=Sex, color = factor(fourclusterkmeans.cluster))))

#Graph the different solutions - Five Clusters.
#Shapes indicate Language Background. To change which variable is marked by shape, change the name of the variable in "shape=Language
ggplot(Clusters, aes(Time_hw,Per_correct_hw, group = factor(fiveclusterkmeans.cluster))) + geom_point((aes(shape=Language, color = factor(fiveclusterkmeans.cluster))))
ggplot(Clusters, aes(Time_hw,Time_LS, group = factor(fiveclusterkmeans.cluster))) + geom_point((aes(shape=Language, color = factor(fiveclusterkmeans.cluster))))
ggplot(Clusters, aes(Per_correct_hw,Final_grade, group = factor(fiveclusterkmeans.cluster))) + geom_point((aes(shape=Language, color = factor(fiveclusterkmeans.cluster))))
ggplot(Clusters, aes(Per_correct,Per_aware, group = factor(fiveclusterkmeans.cluster))) + geom_point((aes(shape=Language, color = factor(fiveclusterkmeans.cluster))))
ggplot(Clusters, aes(Per_complete_LS,Final_grade, group = factor(fiveclusterkmeans.cluster))) + geom_point((aes(shape=Language, color = factor(fiveclusterkmeans.cluster))))
ggplot(Clusters, aes(Per_complete_LS,IU, group = factor(fiveclusterkmeans.cluster))) + geom_point((aes(shape=Language, color = factor(fiveclusterkmeans.cluster))))
ggplot(Clusters, aes(Time_LS,Final_grade, group = factor(fiveclusterkmeans.cluster))) + geom_point((aes(shape=Language, color = factor(fiveclusterkmeans.cluster))))
ggplot(Clusters, aes(IU,Final_grade, group = factor(fiveclusterkmeans.cluster))) + geom_point((aes(shape=Language, color = factor(fiveclusterkmeans.cluster))))
ggplot(Clusters, aes(IU,Time_LS, group = factor(fiveclusterkmeans.cluster))) + geom_point((aes(shape=Language, color = factor(fiveclusterkmeans.cluster))))
ggplot(Clusters, aes(IU,Time_hw, group = factor(fiveclusterkmeans.cluster))) + geom_point((aes(shape=Language, color = factor(fiveclusterkmeans.cluster))))
LS0tCnRpdGxlOiAiUiBOb3RlYm9vayIKb3V0cHV0OiBodG1sX25vdGVib29rCi0tLQogIApgYGB7cn0KI2xvYWQgcmVsZXZhbnQgbGlicmFyaWVzCmxpYnJhcnkoZHBseXIpCmxpYnJhcnkoZ2dwbG90MikKCiNJbXBvcnQgZGF0YSBpbnRvIGEgbmV3IGRhdGEgZnJhbWUKTWFzdGVyRGF0YTwtcmVhZC5jc3YoIn4vZG93bmxvYWRzL0RhdGEgU3VtbWFyeV9DTEVBTi5jc3YiKQojZWxpbWluYXRpbmcgcmVkdW5kYW50IGNvbHVtbnMKTWFzdGVyRGF0YTwtTWFzdGVyRGF0YVssMToxMl0KI0NoYW5naW5nIGNvbHVtbiBuYW1lcwpuYW1lcyhNYXN0ZXJEYXRhKSA8LSBjKCJJRCIsIlNleCIsIkxhbmd1YWdlIiwiRmluYWxfZ3JhZGUiLCJJVSIsIlBlcl9jb3JyZWN0IiwiUGVyX2F3YXJlIiwiVGltZV9odyIsIlRpbWVfcHJvbiIsIlRpbWVfTFMiLCJQZXJfY29ycmVjdF9odyIsIlBlcl9jb21wbGV0ZV9MUyIpCgpgYGAKCmBgYHtyfQojRXhhbWluZSBzY2F0dGVyIHBsb3RzIGZvciBkaWZmZXJlbnQgdmFyaWFibGUgY29tYmluYXRpb24gcGFpcnMKI0NyZWF0aW5nIHNjYXR0ZXIgcGxvdHMgZm9yIGFsbCBwYWlycwpwYWlycyhNYXN0ZXJEYXRhKQojVGltZSBzcGVudCBvbiBDb25uZWN0IGhvbWV3b3JrLCBQZXJjZW50YWdlIG9mIGNvcnJlY3QgaG9tZXdvcmsgcmVzcG9uc2VzCmdncGxvdChNYXN0ZXJEYXRhLCBhZXMoVGltZV9odyxQZXJfY29ycmVjdF9odykpKyBnZW9tX3BvaW50KCkgKyBzdGF0X3N1bShhZXMoZ3JvdXAgPSAxKSkKI1RpbWUgc3BlbnQgb24gQ29ubmVjdCBob21ld29yaywgVGltZSBzcGVudCBvbiBMZWFyblNtYXJ0IGFkYXB0aXZlIGFjdGl2aXRpZXMKZ2dwbG90KE1hc3RlckRhdGEsIGFlcyhUaW1lX2h3LFRpbWVfTFMpKSsgZ2VvbV9wb2ludCgpICsgc3RhdF9zdW0oYWVzKGdyb3VwID0gMSkpCiNQZXJjZW50YWdlIG9mIGNvcnJlY3QgaG9tZXdvcmsgcmVzcG9uc2VzLCBGaW5hbCBjb3Vyc2UgZ3JhZGUKZ2dwbG90KE1hc3RlckRhdGEsIGFlcyhQZXJfY29ycmVjdF9odyxGaW5hbF9ncmFkZSkpKyBnZW9tX3BvaW50KCkgKyBzdGF0X3N1bShhZXMoZ3JvdXAgPSAxKSkKI1BlcmNlbnRhZ2Ugb2YgY29ycmVjdCBMZWFyblNtYXJ0IHJlc3BvbnNlcywgUGVyY2VudGFnZSBvZiBhd2FyZW5lc3Mgb2YgY29ycmVjdC9pbmNvcnJlY3QgcmVzcG9uc2VzCmdncGxvdChNYXN0ZXJEYXRhLCBhZXMoUGVyX2NvcnJlY3QsUGVyX2F3YXJlKSkrIGdlb21fcG9pbnQoKSArIHN0YXRfc3VtKGFlcyhncm91cCA9IDEpKQojUGVyY2VudGFnZSBvZiBjb21wbGV0aW9uIG9mIGFzc2lnbmVkIExlYXJuU21hcnQgYWN0aXZpdGllcywgRmluYWwgY291cnNlIGdyYWRlCmdncGxvdChNYXN0ZXJEYXRhLCBhZXMoUGVyX2NvbXBsZXRlX0xTLEZpbmFsX2dyYWRlKSkrIGdlb21fcG9pbnQoKSArIHN0YXRfc3VtKGFlcyhncm91cCA9IDEpKQojUGVyY2VudGFnZSBvZiBjb21wbGV0aW9uIG9mIGFzc2lnbmVkIExlYXJuU21hcnQgYWN0aXZpdGllcywgUGVyY2VudGFnZSBvZiBpbmNvcnJlY3QgYW5kIHVuYXdhcmUgTGVhcm5TbWFydCByZXNwb25zZXMKZ2dwbG90KE1hc3RlckRhdGEsIGFlcyhQZXJfY29tcGxldGVfTFMsSVUpKSsgZ2VvbV9wb2ludCgpICsgc3RhdF9zdW0oYWVzKGdyb3VwID0gMSkpCiNUaW1lIHNwZW50IG9uIExlYXJuU21hcnQgYWRhcHRpdmUgYWN0aXZpdGllcywgRmluYWwgY291cnNlIGdyYWRlCmdncGxvdChNYXN0ZXJEYXRhLCBhZXMoVGltZV9MUyxGaW5hbF9ncmFkZSkpKyBnZW9tX3BvaW50KCkgKyBzdGF0X3N1bShhZXMoZ3JvdXAgPSAxKSkKI1BlcmNlbnRhZ2Ugb2YgaW5jb3JyZWN0IGFuZCB1bmF3YXJlIExlYXJuU21hcnQgcmVzcG9uc2VzLCBGaW5hbCBjb3Vyc2UgZ3JhZGUKZ2dwbG90KE1hc3RlckRhdGEsIGFlcyhJVSxGaW5hbF9ncmFkZSkpKyBnZW9tX3BvaW50KCkgKyBzdGF0X3N1bShhZXMoZ3JvdXAgPSAxKSkKI1BlcmNlbnRhZ2Ugb2YgaW5jb3JyZWN0IGFuZCB1bmF3YXJlIExlYXJuU21hcnQgcmVzcG9uc2VzLCBUaW1lIHNwZW50IG9uIExlYXJuU21hcnQgYWRhcHRpdmUgYWN0aXZpdGllcwpnZ3Bsb3QoTWFzdGVyRGF0YSwgYWVzKElVLFRpbWVfTFMpKSsgZ2VvbV9wb2ludCgpICsgc3RhdF9zdW0oYWVzKGdyb3VwID0gMSkpCiNQZXJjZW50YWdlIG9mIGluY29ycmVjdCBhbmQgdW5hd2FyZSBMZWFyblNtYXJ0IHJlc3BvbnNlcywgVGltZSBzcGVudCBvbiBDb25uZWN0IGhvbWV3b3JrCmdncGxvdChNYXN0ZXJEYXRhLCBhZXMoSVUsVGltZV9odykpKyBnZW9tX3BvaW50KCkgKyBzdGF0X3N1bShhZXMoZ3JvdXAgPSAxKSkKYGBgCgpgYGB7cn0KI0NyZWF0ZSBuZXcgZGF0YSBmcmFtZSBmb3Igc2NhbGVkIGRhdGEsIHJlbW92aW5nIG5vbi1jbHVzdGVyaW5nIHZhcmlhYmxlcwpTY2FsZWREYXRhPC1hcy5kYXRhLmZyYW1lKGNiaW5kKE1hc3RlckRhdGFbLDE6M10sc2NhbGUoc2VsZWN0KE1hc3RlckRhdGEsIEZpbmFsX2dyYWRlOlBlcl9jb21wbGV0ZV9MUykpKSkKI0NhbGN1bGF0ZSBNZWFuIGFuZCBTdGFuZGFyZCBEZXZpYXRpb24gZm9yIHNjYWxlZCBkYXRhCnNhcHBseShTY2FsZWREYXRhWyw0OjEyXSwgbWVhbikKc2FwcGx5KFNjYWxlZERhdGFbLDQ6MTJdLCBzZCkKYGBgCgpgYGB7cn0KI0NyZWF0aW5nIHRoZSBXaXRoaW4gR3JvdXAgU3VtIG9mIFNxdWFyZXMgZnVuY3Rpb24Kd3NzcGxvdCA8LSBmdW5jdGlvbihkYXRhLCBuYz0xNSwgc2VlZD0xMjM0KXsKICB3c3MgPC0gKG5yb3coZGF0YSktMSkqc3VtKGFwcGx5KGRhdGEsMix2YXIpKQogIGZvciAoaSBpbiAyOm5jKXsKICAgIHNldC5zZWVkKHNlZWQpCiAgICB3c3NbaV0gPC0gc3VtKGttZWFucyhkYXRhLCBjZW50ZXJzPWkpJHdpdGhpbnNzKX0KICBwbG90KDE6bmMsIHdzcywgdHlwZT0iYiIsIHhsYWI9Ik51bWJlciBvZiBDbHVzdGVycyIsCiAgICAgICB5bGFiPSJXaXRoaW4gZ3JvdXBzIHN1bSBvZiBzcXVhcmVzIil9CgojQ3JlYXRlIHRoZSBXU1MgR3JhcGgKd3NzcGxvdChTY2FsZWREYXRhWyw0OjEyXSxuYz0xNSxzZWVkPTEyMzQpCmBgYApgYGB7cn0KI0NyZWF0ZSBhbmQgZXhhbWluZSBzZXZlcmFsIGRpZmZlcmVudCBwb3NzaWJsZSBjbHVzdGVyIHNvbHV0aW9ucwp0aHJlZWNsdXN0ZXJrbWVhbnM8LWttZWFucyhTY2FsZWREYXRhWyw0OjEyXSwgMywgbnN0YXJ0PTEwKQp0aHJlZWNsdXN0ZXJrbWVhbnMKZm91cmNsdXN0ZXJrbWVhbnM8LWttZWFucyhTY2FsZWREYXRhWyw0OjEyXSwgNCwgbnN0YXJ0PTEwKQpmb3VyY2x1c3RlcmttZWFucwpgYGAKYGBge3J9CiNBc3NpZ24gdGhlIGNsdXN0ZXJzIGZvciBlYWNoIG9ic2VydmF0aW9uIGZvciBrPTMsNCB0byBhIG5ldyBkYXRhZnJhbWUKQ2x1c3RlcnM8LWRhdGEuZnJhbWUoU2NhbGVkRGF0YSwgdGhyZWVjbHVzdGVya21lYW5zJGNsdXN0ZXIsIGZvdXJjbHVzdGVya21lYW5zJGNsdXN0ZXIpCmBgYAoKYGBge3J9CiNHcmFwaCB0aGUgZGlmZmVyZW50IHNvbHV0aW9ucyAtIFRocmVlIENsdXN0ZXJzLgojU2hhcGVzIGluZGljYXRlIExhbmd1YWdlIEJhY2tncm91bmQuIFRvIGNoYW5nZSB3aGljaCB2YXJpYWJsZSBpcyBtYXJrZWQgYnkgc2hhcGUsIGNoYW5nZSB0aGUgbmFtZSBvZiB0aGUgdmFyaWFibGUgaW4gInNoYXBlPUxhbmd1YWdlIgpnZ3Bsb3QoQ2x1c3RlcnMsIGFlcyhUaW1lX2h3LFBlcl9jb3JyZWN0X2h3LCBncm91cCA9IGZhY3Rvcih0aHJlZWNsdXN0ZXJrbWVhbnMuY2x1c3RlcikpKSArIGdlb21fcG9pbnQoKGFlcyhzaGFwZT1MYW5ndWFnZSwgY29sb3IgPSBmYWN0b3IodGhyZWVjbHVzdGVya21lYW5zLmNsdXN0ZXIpKSkpCmdncGxvdChDbHVzdGVycywgYWVzKFRpbWVfaHcsVGltZV9MUywgZ3JvdXAgPSBmYWN0b3IodGhyZWVjbHVzdGVya21lYW5zLmNsdXN0ZXIpKSkgKyBnZW9tX3BvaW50KChhZXMoc2hhcGU9TGFuZ3VhZ2UsIGNvbG9yID0gZmFjdG9yKHRocmVlY2x1c3RlcmttZWFucy5jbHVzdGVyKSkpKQpnZ3Bsb3QoQ2x1c3RlcnMsIGFlcyhQZXJfY29ycmVjdF9odyxGaW5hbF9ncmFkZSwgZ3JvdXAgPSBmYWN0b3IodGhyZWVjbHVzdGVya21lYW5zLmNsdXN0ZXIpKSkgKyBnZW9tX3BvaW50KChhZXMoc2hhcGU9TGFuZ3VhZ2UsIGNvbG9yID0gZmFjdG9yKHRocmVlY2x1c3RlcmttZWFucy5jbHVzdGVyKSkpKQpnZ3Bsb3QoQ2x1c3RlcnMsIGFlcyhQZXJfY29ycmVjdCxQZXJfYXdhcmUsIGdyb3VwID0gZmFjdG9yKHRocmVlY2x1c3RlcmttZWFucy5jbHVzdGVyKSkpICsgZ2VvbV9wb2ludCgoYWVzKHNoYXBlPUxhbmd1YWdlLCBjb2xvciA9IGZhY3Rvcih0aHJlZWNsdXN0ZXJrbWVhbnMuY2x1c3RlcikpKSkKZ2dwbG90KENsdXN0ZXJzLCBhZXMoUGVyX2NvbXBsZXRlX0xTLEZpbmFsX2dyYWRlLCBncm91cCA9IGZhY3Rvcih0aHJlZWNsdXN0ZXJrbWVhbnMuY2x1c3RlcikpKSArIGdlb21fcG9pbnQoKGFlcyhzaGFwZT1MYW5ndWFnZSwgY29sb3IgPSBmYWN0b3IodGhyZWVjbHVzdGVya21lYW5zLmNsdXN0ZXIpKSkpCmdncGxvdChDbHVzdGVycywgYWVzKFBlcl9jb21wbGV0ZV9MUyxJVSwgZ3JvdXAgPSBmYWN0b3IodGhyZWVjbHVzdGVya21lYW5zLmNsdXN0ZXIpKSkgKyBnZW9tX3BvaW50KChhZXMoc2hhcGU9TGFuZ3VhZ2UsIGNvbG9yID0gZmFjdG9yKHRocmVlY2x1c3RlcmttZWFucy5jbHVzdGVyKSkpKQpnZ3Bsb3QoQ2x1c3RlcnMsIGFlcyhUaW1lX0xTLEZpbmFsX2dyYWRlLCBncm91cCA9IGZhY3Rvcih0aHJlZWNsdXN0ZXJrbWVhbnMuY2x1c3RlcikpKSArIGdlb21fcG9pbnQoKGFlcyhzaGFwZT1MYW5ndWFnZSwgY29sb3IgPSBmYWN0b3IodGhyZWVjbHVzdGVya21lYW5zLmNsdXN0ZXIpKSkpCmdncGxvdChDbHVzdGVycywgYWVzKElVLEZpbmFsX2dyYWRlLCBncm91cCA9IGZhY3Rvcih0aHJlZWNsdXN0ZXJrbWVhbnMuY2x1c3RlcikpKSArIGdlb21fcG9pbnQoKGFlcyhzaGFwZT1MYW5ndWFnZSwgY29sb3IgPSBmYWN0b3IodGhyZWVjbHVzdGVya21lYW5zLmNsdXN0ZXIpKSkpCmdncGxvdChDbHVzdGVycywgYWVzKElVLFRpbWVfTFMsIGdyb3VwID0gZmFjdG9yKHRocmVlY2x1c3RlcmttZWFucy5jbHVzdGVyKSkpICsgZ2VvbV9wb2ludCgoYWVzKHNoYXBlPUxhbmd1YWdlLCBjb2xvciA9IGZhY3Rvcih0aHJlZWNsdXN0ZXJrbWVhbnMuY2x1c3RlcikpKSkKZ2dwbG90KENsdXN0ZXJzLCBhZXMoSVUsVGltZV9odywgZ3JvdXAgPSBmYWN0b3IodGhyZWVjbHVzdGVya21lYW5zLmNsdXN0ZXIpKSkgKyBnZW9tX3BvaW50KChhZXMoc2hhcGU9TGFuZ3VhZ2UsIGNvbG9yID0gZmFjdG9yKHRocmVlY2x1c3RlcmttZWFucy5jbHVzdGVyKSkpKQpgYGAKCmBgYHtyfQojR3JhcGggdGhlIGRpZmZlcmVudCBzb2x1dGlvbnMgLSBGb3VyIENsdXN0ZXJzLgojU2hhcGVzIGluZGljYXRlIExhbmd1YWdlIEJhY2tncm91bmQuIFRvIGNoYW5nZSB3aGljaCB2YXJpYWJsZSBpcyBtYXJrZWQgYnkgc2hhcGUsIGNoYW5nZSB0aGUgbmFtZSBvZiB0aGUgdmFyaWFibGUgaW4gInNoYXBlPUxhbmd1YWdlCmdncGxvdChDbHVzdGVycywgYWVzKFRpbWVfaHcsUGVyX2NvcnJlY3RfaHcsIGdyb3VwID0gZmFjdG9yKGZvdXJjbHVzdGVya21lYW5zLmNsdXN0ZXIpKSkgKyBnZW9tX3BvaW50KChhZXMoc2l6ZT0yLHNoYXBlPUxhbmd1YWdlLCBjb2xvciA9IGZhY3Rvcihmb3VyY2x1c3RlcmttZWFucy5jbHVzdGVyKSkpKQpnZ3Bsb3QoQ2x1c3RlcnMsIGFlcyhUaW1lX2h3LFRpbWVfTFMsIGdyb3VwID0gZmFjdG9yKGZvdXJjbHVzdGVya21lYW5zLmNsdXN0ZXIpKSkgKyBnZW9tX3BvaW50KChhZXMoc2l6ZT0yLHNoYXBlPUxhbmd1YWdlLCBjb2xvciA9IGZhY3Rvcihmb3VyY2x1c3RlcmttZWFucy5jbHVzdGVyKSkpKQpnZ3Bsb3QoQ2x1c3RlcnMsIGFlcyhQZXJfY29ycmVjdF9odyxGaW5hbF9ncmFkZSwgZ3JvdXAgPSBmYWN0b3IoZm91cmNsdXN0ZXJrbWVhbnMuY2x1c3RlcikpKSArIGdlb21fcG9pbnQoKGFlcyhzaXplPTIsc2hhcGU9TGFuZ3VhZ2UsIGNvbG9yID0gZmFjdG9yKGZvdXJjbHVzdGVya21lYW5zLmNsdXN0ZXIpKSkpCmdncGxvdChDbHVzdGVycywgYWVzKFBlcl9jb3JyZWN0LFBlcl9hd2FyZSwgZ3JvdXAgPSBmYWN0b3IoZm91cmNsdXN0ZXJrbWVhbnMuY2x1c3RlcikpKSArIGdlb21fcG9pbnQoKGFlcyhzaXplPTIsc2hhcGU9TGFuZ3VhZ2UsIGNvbG9yID0gZmFjdG9yKGZvdXJjbHVzdGVya21lYW5zLmNsdXN0ZXIpKSkpCmdncGxvdChDbHVzdGVycywgYWVzKFBlcl9jb21wbGV0ZV9MUyxGaW5hbF9ncmFkZSwgZ3JvdXAgPSBmYWN0b3IoZm91cmNsdXN0ZXJrbWVhbnMuY2x1c3RlcikpKSArIGdlb21fcG9pbnQoKGFlcyhzaXplPTIsc2hhcGU9TGFuZ3VhZ2UsIGNvbG9yID0gZmFjdG9yKGZvdXJjbHVzdGVya21lYW5zLmNsdXN0ZXIpKSkpCmdncGxvdChDbHVzdGVycywgYWVzKFBlcl9jb21wbGV0ZV9MUyxJVSwgZ3JvdXAgPSBmYWN0b3IoZm91cmNsdXN0ZXJrbWVhbnMuY2x1c3RlcikpKSArIGdlb21fcG9pbnQoKGFlcyhzaXplPTIsc2hhcGU9TGFuZ3VhZ2UsIGNvbG9yID0gZmFjdG9yKGZvdXJjbHVzdGVya21lYW5zLmNsdXN0ZXIpKSkpCmdncGxvdChDbHVzdGVycywgYWVzKFRpbWVfTFMsRmluYWxfZ3JhZGUsIGdyb3VwID0gZmFjdG9yKGZvdXJjbHVzdGVya21lYW5zLmNsdXN0ZXIpKSkgKyBnZW9tX3BvaW50KChhZXMoc2l6ZT0yLHNoYXBlPUxhbmd1YWdlLCBjb2xvciA9IGZhY3Rvcihmb3VyY2x1c3RlcmttZWFucy5jbHVzdGVyKSkpKQpnZ3Bsb3QoQ2x1c3RlcnMsIGFlcyhJVSxGaW5hbF9ncmFkZSwgZ3JvdXAgPSBmYWN0b3IoZm91cmNsdXN0ZXJrbWVhbnMuY2x1c3RlcikpKSArIGdlb21fcG9pbnQoKGFlcyhzaXplPTIsc2hhcGU9TGFuZ3VhZ2UsIGNvbG9yID0gZmFjdG9yKGZvdXJjbHVzdGVya21lYW5zLmNsdXN0ZXIpKSkpCmdncGxvdChDbHVzdGVycywgYWVzKElVLFRpbWVfTFMsIGdyb3VwID0gZmFjdG9yKGZvdXJjbHVzdGVya21lYW5zLmNsdXN0ZXIpKSkgKyBnZW9tX3BvaW50KChhZXMoc2l6ZT0yLHNoYXBlPUxhbmd1YWdlLCBjb2xvciA9IGZhY3Rvcihmb3VyY2x1c3RlcmttZWFucy5jbHVzdGVyKSkpKQpnZ3Bsb3QoQ2x1c3RlcnMsIGFlcyhJVSxUaW1lX2h3LCBncm91cCA9IGZhY3Rvcihmb3VyY2x1c3RlcmttZWFucy5jbHVzdGVyKSkpICsgZ2VvbV9wb2ludCgoYWVzKHNpemU9MixzaGFwZT1MYW5ndWFnZSwgY29sb3IgPSBmYWN0b3IoZm91cmNsdXN0ZXJrbWVhbnMuY2x1c3RlcikpKSkKYGBgCmBgYHtyfQojR3JhcGggdGhlIGRpZmZlcmVudCBzb2x1dGlvbnMgLSBGaXZlIENsdXN0ZXJzLgojU2hhcGVzIGluZGljYXRlIExhbmd1YWdlIEJhY2tncm91bmQuIFRvIGNoYW5nZSB3aGljaCB2YXJpYWJsZSBpcyBtYXJrZWQgYnkgc2hhcGUsIGNoYW5nZSB0aGUgbmFtZSBvZiB0aGUgdmFyaWFibGUgaW4gInNoYXBlPUxhbmd1YWdlCmdncGxvdChDbHVzdGVycywgYWVzKFRpbWVfaHcsUGVyX2NvcnJlY3RfaHcsIGdyb3VwID0gZmFjdG9yKGZpdmVjbHVzdGVya21lYW5zLmNsdXN0ZXIpKSkgKyBnZW9tX3BvaW50KChhZXMoc2hhcGU9TGFuZ3VhZ2UsIGNvbG9yID0gZmFjdG9yKGZpdmVjbHVzdGVya21lYW5zLmNsdXN0ZXIpKSkpCmdncGxvdChDbHVzdGVycywgYWVzKFRpbWVfaHcsVGltZV9MUywgZ3JvdXAgPSBmYWN0b3IoZml2ZWNsdXN0ZXJrbWVhbnMuY2x1c3RlcikpKSArIGdlb21fcG9pbnQoKGFlcyhzaGFwZT1MYW5ndWFnZSwgY29sb3IgPSBmYWN0b3IoZml2ZWNsdXN0ZXJrbWVhbnMuY2x1c3RlcikpKSkKZ2dwbG90KENsdXN0ZXJzLCBhZXMoUGVyX2NvcnJlY3RfaHcsRmluYWxfZ3JhZGUsIGdyb3VwID0gZmFjdG9yKGZpdmVjbHVzdGVya21lYW5zLmNsdXN0ZXIpKSkgKyBnZW9tX3BvaW50KChhZXMoc2hhcGU9TGFuZ3VhZ2UsIGNvbG9yID0gZmFjdG9yKGZpdmVjbHVzdGVya21lYW5zLmNsdXN0ZXIpKSkpCmdncGxvdChDbHVzdGVycywgYWVzKFBlcl9jb3JyZWN0LFBlcl9hd2FyZSwgZ3JvdXAgPSBmYWN0b3IoZml2ZWNsdXN0ZXJrbWVhbnMuY2x1c3RlcikpKSArIGdlb21fcG9pbnQoKGFlcyhzaGFwZT1MYW5ndWFnZSwgY29sb3IgPSBmYWN0b3IoZml2ZWNsdXN0ZXJrbWVhbnMuY2x1c3RlcikpKSkKZ2dwbG90KENsdXN0ZXJzLCBhZXMoUGVyX2NvbXBsZXRlX0xTLEZpbmFsX2dyYWRlLCBncm91cCA9IGZhY3RvcihmaXZlY2x1c3RlcmttZWFucy5jbHVzdGVyKSkpICsgZ2VvbV9wb2ludCgoYWVzKHNoYXBlPUxhbmd1YWdlLCBjb2xvciA9IGZhY3RvcihmaXZlY2x1c3RlcmttZWFucy5jbHVzdGVyKSkpKQpnZ3Bsb3QoQ2x1c3RlcnMsIGFlcyhQZXJfY29tcGxldGVfTFMsSVUsIGdyb3VwID0gZmFjdG9yKGZpdmVjbHVzdGVya21lYW5zLmNsdXN0ZXIpKSkgKyBnZW9tX3BvaW50KChhZXMoc2hhcGU9TGFuZ3VhZ2UsIGNvbG9yID0gZmFjdG9yKGZpdmVjbHVzdGVya21lYW5zLmNsdXN0ZXIpKSkpCmdncGxvdChDbHVzdGVycywgYWVzKFRpbWVfTFMsRmluYWxfZ3JhZGUsIGdyb3VwID0gZmFjdG9yKGZpdmVjbHVzdGVya21lYW5zLmNsdXN0ZXIpKSkgKyBnZW9tX3BvaW50KChhZXMoc2hhcGU9TGFuZ3VhZ2UsIGNvbG9yID0gZmFjdG9yKGZpdmVjbHVzdGVya21lYW5zLmNsdXN0ZXIpKSkpCmdncGxvdChDbHVzdGVycywgYWVzKElVLEZpbmFsX2dyYWRlLCBncm91cCA9IGZhY3RvcihmaXZlY2x1c3RlcmttZWFucy5jbHVzdGVyKSkpICsgZ2VvbV9wb2ludCgoYWVzKHNoYXBlPUxhbmd1YWdlLCBjb2xvciA9IGZhY3RvcihmaXZlY2x1c3RlcmttZWFucy5jbHVzdGVyKSkpKQpnZ3Bsb3QoQ2x1c3RlcnMsIGFlcyhJVSxUaW1lX0xTLCBncm91cCA9IGZhY3RvcihmaXZlY2x1c3RlcmttZWFucy5jbHVzdGVyKSkpICsgZ2VvbV9wb2ludCgoYWVzKHNoYXBlPUxhbmd1YWdlLCBjb2xvciA9IGZhY3RvcihmaXZlY2x1c3RlcmttZWFucy5jbHVzdGVyKSkpKQpnZ3Bsb3QoQ2x1c3RlcnMsIGFlcyhJVSxUaW1lX2h3LCBncm91cCA9IGZhY3RvcihmaXZlY2x1c3RlcmttZWFucy5jbHVzdGVyKSkpICsgZ2VvbV9wb2ludCgoYWVzKHNoYXBlPUxhbmd1YWdlLCBjb2xvciA9IGZhY3RvcihmaXZlY2x1c3RlcmttZWFucy5jbHVzdGVyKSkpKQ==